home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 398 / 398.xpi / chrome / forecastfox.jar / content / parser / converter-service.js < prev    next >
Text File  |  2010-02-04  |  7KB  |  250 lines

  1. /*------------------------------------------------------------------------------
  2.   Copyright (c) 2008 Ensolis, LLC. All Rights Reserved.
  3.   ----------------------------------------------------------------------------*/
  4.  
  5. /******************************************************************************
  6.  * Interfaces used by a service to convert parsed weather data from one
  7.  * unit of measure to another.  Supplies a set
  8.  * items and methods used for manipulating the data.
  9.  * 
  10.  * @status    FROZEN
  11.  * @version   1.0
  12.  ******************************************************************************/
  13. function ConverterService() 
  14. {  
  15.   //setup a new error
  16.   this._error = Cc["@ensolis.com/forecastfox/error-item;1"].
  17.                 createInstance(Ci.ffIErrorItem);    
  18. }
  19.  
  20. ConverterService.prototype = {
  21.   __proto__: new ServiceBase("ConverterService"),
  22.               
  23.   ////////////////////////////////
  24.   // ffIService
  25.           
  26.   /**
  27.    * Initialize the component.  Called by the manager service.
  28.    */    
  29.   start: function ConverterService_start()
  30.   {
  31.     //setup the variables
  32.     this._items = {};
  33.         
  34.     //load the converters
  35.     return this._loadConverters();
  36.   },
  37.   
  38.   /**
  39.    * Destroy the component.  Called by the manager service.  This may be
  40.    * called prior to start so it needs to be safe.
  41.    */  
  42.   stop: function ConverterService_stop()
  43.   {
  44.     //clear variables
  45.     this._items = null; 
  46.   },
  47.               
  48.   ////////////////////////////////
  49.   // ffIConverterService
  50.     
  51.   /**
  52.    * Service has a specific item.
  53.    * 
  54.    * @param   ID of the converter item.
  55.    * @return  True if item exists.
  56.    */
  57.   hasItem: function ConverterService_hasItem(aID)
  58.   {    
  59.     return this._items.hasOwnProperty(aID);
  60.   },
  61.                            
  62.   /**
  63.    * Retrieve a converter item returns null if item doesn't exist.
  64.    * 
  65.    * @param   ID of the converter item.
  66.    * @return  A ffIConverterItem.
  67.    */
  68.   getItem: function ConverterService_getItem(aID)
  69.   {
  70.     if (!this.hasItem(aID))
  71.       return null;
  72.     else
  73.       return this._createItem(this._items[aID]);
  74.   },
  75.   
  76.   /**
  77.    * Retrieve an array of converter items.
  78.    * 
  79.    * @param   Conversion of the item.
  80.    * @param   Count of items in the array.
  81.    * @return  An array of ffIConverterItem components.
  82.    */
  83.   getItems: function ConverterService_getItems(aConversion, aCount)
  84.   {
  85.     //get the current uom
  86.     var units = getPref("units.current");
  87.     
  88.     //loop through items
  89.     var items = [];
  90.     for (var id in this._items) {
  91.       var item = this._items[id];
  92.  
  93.       //match on conversion and units
  94.       //exclude the default conversion
  95.       if (item.conversion == aConversion && 
  96.           item.units == units && item.name != "none")
  97.         items.push(this.getItem(id));
  98.     }
  99.     
  100.     //return the array
  101.     aCount.value = items.length;
  102.     return items; 
  103.   },
  104.   
  105.   /**
  106.    * Format the value of a parser item.
  107.    * 
  108.    * @param   Conversion name.
  109.    * @param   Name of the converter or null.
  110.    * @param   Feed data to format.
  111.    * @return  The formatted value of the itme.
  112.    */
  113.   formatValue: function ConverterService_formatValue(aConversion, aConverter, aValue)
  114.   {
  115.     //get the current uom
  116.     var units = String(getPref("units.current"));
  117.              
  118.     //get the converter name
  119.     var converter = (!aConverter) ? "none" : aConverter; 
  120.     
  121.     //use the default if the requested converter not found
  122.     var id = aConversion + "-" + units + "-" + converter;
  123.     if (!this.hasItem(id))
  124.       id = aConversion + "-" + units + "-none";
  125.       
  126.     //replace the value in the calculation
  127.     converter = this._items[id];   
  128.     var calc = converter.calc;
  129.     calc = calc.replace(/\$VAL/g, "'" + String(aValue) + "'"); 
  130.       
  131.     //replace the calcualation in the format string
  132.     var format = converter.format;
  133.     format = format.replace(/\$CALC/g, calc);
  134.     
  135.     //translate the abbreviation if we have it
  136.     var abbr = "''";
  137.     if (converter.hasOwnProperty("abbr")) {
  138.       abbr = converter.abbr;    
  139.       try {
  140.         abbr = this.bundle.GetStringFromName("ff.converters.abbr." + 
  141.                                              converter.abbr);
  142.       } catch(e) {}
  143.     }
  144.     
  145.     //replace the abbreviation in the format string
  146.     format = format.replace(/\$ABBR/g, abbr);
  147.     
  148.     //return the formatted string
  149.     try {
  150.       return eval(format);
  151.     } catch(e) {}
  152.     
  153.     //return the unformatted value because the eval failed
  154.     return aValue;      
  155.   },
  156.               
  157.   ////////////////////////////////
  158.   // Internal Functions  
  159.   
  160.   /**
  161.    * Create a converter item from a javascript object 
  162.    * representing that item.
  163.    *
  164.    * @param   The javascript representation of the item.
  165.    * @return  The converter item.
  166.    */
  167.   _createItem: function ConverterService__createItem(aItem)
  168.   {
  169.     //create an empty converter item
  170.     var item = Cc["@ensolis.com/forecastfox/converter-item;1"].
  171.                createInstance(Ci.ffIConverterItem);
  172.                
  173.     //loop through the properties
  174.     for (var property in aItem)
  175.       item.setProperty(property, aItem[property]);
  176.     
  177.     //set the description
  178.     var description = item.name;
  179.     try {
  180.       description = this.bundle.GetStringFromName("ff.converters." + 
  181.                                                   item.conversion + "." + 
  182.                                                   item.name);
  183.     } finally {
  184.       item.setProperty("description", description);
  185.     }
  186.             
  187.     //set the ID
  188.     var id = item.conversion + "-" + String(item.units) + "-" + item.name;
  189.     item.setProperty("ID", id);
  190.     
  191.     //return the item
  192.     return item;
  193.   },
  194.   
  195.   /**
  196.    * Load the converter data.
  197.    *
  198.    * @return  False if the load fails.
  199.    */
  200.   _loadConverters: function ConverterService__loadConverters()
  201.   {
  202.     //setup error variables
  203.     const PREFIX = "ff.converters.load.";
  204.     var name = this.bundle.GetStringFromName(PREFIX + "name");
  205.     var message = "";
  206.       
  207.     //get the disk service
  208.     var mgrSvc = Cc["@ensolis.com/forecastfox/manager-service;1"].
  209.                  getService(Ci.ffIManagerService);
  210.     var dskSvc = mgrSvc.disk;
  211.     
  212.     //get the conversion file
  213.     var file = dskSvc.get("converters.js", TYPE_DEFAULTS);
  214.                               
  215.     //file doesn't exist
  216.     if (!file.exists()) {
  217.       message = this.bundle.GetStringFromName(PREFIX + "exists.message");
  218.       this._error.init(SEVERITY_ERROR, name, message);
  219.       return false;
  220.     }
  221.                           
  222.     //file is not readable
  223.     if (!file.isReadable()) {
  224.       message = this.bundle.formatStringFromName(PREFIX + "read.message",
  225.                                                  [this._file.path], 1);
  226.       this._error.init(SEVERITY_ERROR, name, message);
  227.       return false;
  228.     }
  229.           
  230.     //get the content of the file
  231.     var content = dskSvc.readText(file);
  232.     if (!content) {
  233.       message = this.bundle.GetStringFromName(PREFIX + "empty.message");
  234.       this._error.init(SEVERITY_ERROR, name, message);
  235.       return false;
  236.     }
  237.     
  238.     //save the data in the items variable 
  239.     try {
  240.       this._items = eval(content);
  241.     } catch(e) {
  242.       this._items = {};
  243.       this._error.init(SEVERITY_ERROR, name, e.message);
  244.       return false;
  245.     }
  246.  
  247.     //loaded successfully
  248.     return true;
  249.   }                        
  250. };